/**
 * @file ctrl.h
 * @brief 控制系统核心头文件
 *        定义各类控制设备（DT7遥控器、VT13遥控器、裁判系统）的数据结构及接口函数
 * @author WeiFan Qiu (qiuweifan0523@faxmail.com)
 * @version 1.0
 * @date 2025-08-08
 * 
 * @copyright Copyright (c) 2025 邱伟凡
 * 
 * @par 修改日志:
 * - 2025-08-08: 初始版本创建，定义基础控制结构体和接口
 * 
 * @bug 待解决问题:
 * - 未支持多设备热切换逻辑
 */
#ifndef CTRL_H
#define CTRL_H
#include "stdint.h"
#include "QWF_Custom_Ctrl.h"	// 专控功能头文件
#include "QWF_Include.h"		// 通用包含头文件

/**
 * @brief 电机控制系数宏定义
 * @note 用于将遥控器输入转换为电机控制量的比例因子
 */
#define KM_Yaw_factor 			 0.0035f	// 键鼠yaw转化系数
#define KM_Pitch_factor			 0.002f	// 键鼠pitch转化系数

/**
 * @brief 控制设备类型枚举
 * @details 定义当前系统使用的控制设备类型
 */
typedef enum{
	Null_Ctrl=0,	///< 初始默认无控制设备
	DT7  =1,		///< DT7遥控器
	VT13 =2,		///< VT13遥控器
	Judge=3,		///< 裁判系统控制
}ctrl_type_e;

/**
 * @brief 控制模式枚举
 * @details 定义当前使用的输入模式（遥控器/键鼠）
 */
typedef enum{
	RC=0,			///< 遥控器模式
    KM=1			///< 键鼠模式
}ctrl_mode_e;

/**
 * @brief 键盘按键状态位域结构体
 */
typedef	__packed struct{
	_Bool w		:1;	///< W键按下状态（1:按下）
	_Bool s		:1;	///< S键按下状态
	_Bool a		:1;	///< A键按下状态
	_Bool d		:1;	///< D键按下状态
	_Bool shift	:1;	///< Shift键按下状态
	_Bool ctrl	:1;	///< Ctrl键按下状态
	_Bool q		:1;	///< Q键按下状态
	_Bool e		:1;	///< E键按下状态
	_Bool r		:1;	///< R键按下状态
	_Bool f		:1;	///< F键按下状态
	_Bool g		:1;	///< G键按下状态
	_Bool z		:1;	///< Z键按下状态
	_Bool x		:1;	///< X键按下状态
	_Bool c		:1;	///< C键按下状态
	_Bool v		:1;	///< V键按下状态
	_Bool b		:1;	///< B键按下状态
}key_t;

/*********************************裁判系统控制数据***************************** */
/**
 * @brief 裁判系统鼠标键盘数据结构体（协议文档P39）
 * @details 用于接收裁判系统发送的鼠标和键盘控制指令
 */
typedef __packed struct{
	int16_t mouse_x;			///< 鼠标X轴移动量（相对值）
	int16_t mouse_y;			///< 鼠标Y轴移动量（相对值）
	int16_t mouse_z;			///< 鼠标Z轴（滚轮）移动量
	int8_t left_button_down;	///< 鼠标左键按下状态（1:按下）
	int8_t right_button_down;	///< 鼠标右键按下状态
	key_t keyboard_value;		///< 键盘按键状态（使用key_t结构体）
	uint16_t reserved;			///< 保留字段
}remote_control_t;

/**************************************DT7遥控器控制数据****************************************/ 
/**
 * @brief DT7遥控器控制数据结构体
 */
typedef __packed struct{
	__packed struct{
		int16_t  ch[4];		///< 遥控器通道值（右摇杆左右/上下，左摇杆左右/上下）
		uint8_t  s[2];		///< 开关状态（0:切入 1:切出 2:持续）
		int16_t knob;		///< 旋钮值
	}rc;							///< 遥控器基础数据
	__packed struct{
		int16_t x;			///< 鼠标X轴移动量
		int16_t y;			///< 鼠标Y轴移动量
		int16_t z;			///< 鼠标Z轴（滚轮）移动量
		uint8_t press_l;	///< 鼠标左键按下状态
		uint8_t press_r;	///< 鼠标右键按下状态
	}mouse;						///< 鼠标数据
	key_t key;					///< 键盘按键状态
}DT7_Ctrl_t;
/**********************************VT13遥控器控制数据*******************************************/ 
/**
 * @brief VT13遥控器控制数据结构体
 */
typedef __packed struct{
    __packed struct{
            int16_t ch[4];			///< 遥控器通道值
            uint8_t mode_sw;		///< 模式开关状态
			uint8_t stop;			///< 停止键状态
			uint8_t left_button;	///< 左键（FN键）状态
			uint8_t	right_button;	///< 右键状态
			int16_t wheel;			///< 滚轮值
			uint8_t shutter;		///< 快门键状态
    } rc;							///< 遥控器基础数据
    __packed struct{
            int16_t x;			///< 鼠标X轴移动量
            int16_t y;			///< 鼠标Y轴移动量
            int16_t z;			///< 鼠标Z轴（滚轮）移动量
            uint8_t press_l;	///< 鼠标左键按下状态
            uint8_t press_r;	///< 鼠标右键按下状态
			uint8_t middle;		///< 鼠标中键按下状态
    } mouse;					///< 鼠标数据
	key_t key;					///< 键盘按键状态
	uint16_t 	crc16;			///< CRC16校验值
} VT13_Ctrl_t;

#define VT13_Head_1				0xA9	///< VT13数据帧头1
#define VT13_Head_2				0x53	///< VT13数据帧头2



/**************************************综合控制数据**********************************/ 
/**
 * @brief 通用遥控器数据结构体
 */
typedef __packed struct{
		int16_t  ch[4];		///< 遥控器通道值（右摇杆左右/上下，左摇杆左右/上下）
		uint8_t  s[3];		///< 拨片状态（0:切入 1:切出 2:持续）
}Ctrl_RC_t;

/**
 * @brief 通用键鼠数据结构体
 */
typedef __packed struct{
	__packed struct{
		int16_t x;			///< 鼠标X轴移动量
		int16_t y;			///< 鼠标Y轴移动量
		int16_t z;			///< 鼠标Z轴（滚轮）移动量
		uint8_t press_l;	///< 鼠标左键按下状态
		uint8_t press_r;	///< 鼠标右键按下状态
		uint8_t middle;		///< 鼠标中键按下状态（DT7无此功能）
	}mouse;						///< 鼠标数据
	key_t key;					///< 键盘按键状态
}Ctrl_KM_t;

/**
 * @brief 综合控制管理结构体
 */
typedef __packed struct{
	ctrl_type_e 		type;		///< 当前使用的控制设备类型（DT7/VT13/裁判系统）
	ctrl_mode_e 		mode;		///< 当前控制模式（遥控器/键鼠）
	remote_control_t*   Judge[2];	///< 裁判系统控制数据指针
	DT7_Ctrl_t*			DT7[2];		///< DT7遥控器控制数据指针
	VT13_Ctrl_t* 		VT13[2];	///< VT13遥控器控制数据指针
	Ctrl_RC_t			RC[2];		///< 通用遥控器数据
	Ctrl_KM_t			KM[2];		///< 通用键鼠数据
}Ctrl_t;

extern Ctrl_t* ctrl;	///< 全局控制结构体指针

#if Circuit_Boards!=Chassis_Circuit_Boards//非底盘使用遥控器函数
void DT7_Callback(void);	///< DT7遥控器串口2中断回调（非底盘）
void VT13_Callback(void);	///< VT13遥控器串口1中断回调函数
void VT13_Init(void);				///< VT13遥控器初始化函数
void DT7_Init(void);			// 遥控器初始化函数声明（非底盘板需单独初始化）
#else //底盘使用遥控器函数
void Ctrl_rx_func_chassis(void);	///< 底盘控制数据接收函数
#endif

#endif // CTRL_H
